﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Dominio.Logica;
using Dominio.Entidades;
using Dominio.Excepciones;

namespace Interfaz
{
    public partial class ABMUsuarios : Form
    {
        int opcion;

        public ABMUsuarios()
        {
            InitializeComponent();
        }

        public ABMUsuarios(int opcion)
        {
            this.opcion = opcion;
            InitializeComponent();
            LimpiarForm();
        }

        private void ABMUsuarios_Load(object sender, EventArgs e)
        {
            switch (opcion)
            {
                case 1: //alta usuario
                    CargaAltaUsuarios();
                    break;
                case 2: //modificacion usuario
                    CargaModifUsuarios();
                    break;
                case 3: //baja usuario
                    CargaBajaUsuarios();
                    break;
            }
        }

        private void LimpiarForm()
        {
            txtNombre.Text = "";
            txtPass.Text = "";
            txtRPass.Text = "";
        }

        private void CargaAltaUsuarios()
        {
            pictureBox1.Visible = true;
            pictureBox2.Visible = false;
            pictureBox3.Visible = false;
            lblUsuarios.Visible = false;
            cmbUsuarios.Visible = false;
            checkBox1.Visible = false;
            btnAgregar.Visible = true;
            btnBorrar.Visible = false;
            btnModificar.Visible = false;
            cmbPermisos.Enabled = true;
            cmbPermisos.DataSource = Contexto.GetContexto().Permisos.ToList();
        }

        private void CargaBajaUsuarios()
        {
            pictureBox1.Visible = false;
            pictureBox2.Visible = true;
            pictureBox3.Visible = false;
            checkBox1.Visible = false;
            txtNombre.Enabled = false;
            txtPass.Enabled = false;
            txtRPass.Enabled = false;
            cmbPermisos.Visible = true;
            btnAgregar.Visible = false;
            btnModificar.Visible = false;
            btnBorrar.Visible = true;
            cmbUsuarios.Visible = true;
            cmbUsuarios.DataSource = Usuarios.RecuperarUsuariosActivos();  //trae solo los usuarios activos en la BD
            cmbPermisos.Enabled = false;
            cmbPermisos.DataSource = Contexto.GetContexto().Permisos.ToList();
        }

        private void CargaModifUsuarios()
        {
            pictureBox1.Visible = false;
            pictureBox2.Visible = false;
            pictureBox3.Visible = true;
            txtNombre.Enabled = false;
            txtPass.Enabled = true;
            txtRPass.Enabled = true;
            btnAgregar.Visible = false;
            btnBorrar.Visible = false;
            checkBox1.Visible = false;
            btnModificar.Visible = true;
            cmbUsuarios.DataSource = Usuarios.RecuperarUsuariosActivos();
            cmbPermisos.Enabled = true;
            cmbPermisos.DataSource = Contexto.GetContexto().Permisos.ToList();
        }

        private void cmbUsuarios_SelectedIndexChanged(object sender, EventArgs e)
        {
            Usuarios u = (Usuarios)cmbUsuarios.SelectedItem;
            txtNombre.Text = u.Nombre;
            txtPass.Text = u.Password;
            txtRPass.Text = u.Password;
            cmbPermisos.SelectedItem = u.Permisos1;
            checkBox1.Checked = u.Activo;
            if (opcion == 2)
            {
                txtPass.Enabled = true;
                txtRPass.Enabled = true;
            }
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            Usuarios u = new Usuarios();
            u.Nombre = txtNombre.Text.ToString();
            u.Password = txtPass.Text.ToString();
            Permisos p = (Permisos)cmbPermisos.SelectedItem;
            u.Permisos = p.IdPermiso;
            u.Activo = true;
            if (!(txtPass.Text.ToString().Equals(txtRPass.Text.ToString())))
            {
                MessageBox.Show("Las contraseñas deben coincidir.", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtPass.Text = "";
                txtRPass.Text = "";
                txtPass.Focus();
            }
            else
            {
                try
                {
                    u.ValidarAlta();
                    u.GuardarUsuario();
                    LimpiarForm();
                    MessageBox.Show("Se ha guardado el usuario: " + u.Nombre + " correctamente", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    Log.Grabar("OK: Se ha guardado el usuario: " + u.Nombre + " correctamente, realizado por usuario: " + Agencia.UsuarioLogueado);
                }
                catch (EmptyUserNameException ex)
                {
                    MessageBox.Show(ex.mensaje, "Atención", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    Log.Grabar("ERROR: Se intento dar de alta un usuario en blanco. Realizado por el usuario: " + Agencia.UsuarioLogueado + ex.Message);
                    txtNombre.Focus();
                }
                catch (ExistingUserNameException ex)
                {
                    MessageBox.Show(ex.mensaje, "Atención", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    Log.Grabar("ERROR: Se intento dar de alta el usuario: " + u.Nombre + " pero ya existe en el sistema" + "acción realizada por el usuario: " + Agencia.UsuarioLogueado);
                    txtNombre.Focus();
                }
                catch (EmptyUserPasswordException ex)
                {
                    MessageBox.Show(ex.mensaje, "Atención", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    Log.Grabar("ERROR: Se intento dar de alta un usuario con la clave vacía." + "acción realizada por el usuario: " + Agencia.UsuarioLogueado);
                    txtPass.Focus();
                }
            }
        }

        private void btnBorrar_Click(object sender, EventArgs e)
        {
            Usuarios u = (Usuarios)cmbUsuarios.SelectedItem;
            string nombre = u.Nombre;
            try
            {
                u.EliminarUsuario();
                MessageBox.Show("Se ha borrado el usuario: " + u.Nombre + " correctamente", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                Log.Grabar("OK: Se ha desactivado el usuario: " + u.Nombre + " correctamente , acción realizada por el usuario: " + Agencia.UsuarioLogueado);
                CargaBajaUsuarios(); //Recarga los datos
            }
            catch (NoUserFoundException ex)
            {
                Log.Grabar("ERROR: No se encontró el usuario: " + u.Nombre + " a eliminar. " + ex.Message + "  acción realizada por el usuario: " + Agencia.UsuarioLogueado);
                MessageBox.Show(ex.Message + u.Nombre, "Atención", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }

        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            Usuarios u = (Usuarios)cmbUsuarios.SelectedItem;

            bool cambiaPassword = false;

            bool cambiaPermisos = false;

            string pass = "", permiso = "";

            if (!(u.Password.Equals(txtPass.Text)))
            {
                cambiaPassword = true;
                pass = "la contraseña";
            }

            if (!(u.Permisos1 == cmbPermisos.SelectedItem))
            {
                cambiaPermisos = true;
                permiso = "el permiso";
            }

            if (cambiaPermisos || cambiaPassword)
            {

                if (cambiaPassword && !(txtPass.Text.ToString().Equals(txtRPass.Text.ToString())))
                {
                    MessageBox.Show("Las contraseñas deben coincidir.", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    txtPass.Text = "";
                    txtRPass.Text = "";
                    txtPass.Focus();
                }
                else
                {
                    try
                    {
                        if (cambiaPassword) u.Password = txtPass.Text;
                        if (cambiaPermisos) u.Permisos1 = (Permisos)cmbPermisos.SelectedItem;
                        u.ValidarModificacion();
                        u.ActualizarUsuario(cambiaPassword, cambiaPermisos);
                        Log.Grabar("OK: Se ha modificado " + pass + permiso + " al usuario: " + u.Nombre + " correctamente, acción realizada por el usuario: " + Agencia.UsuarioLogueado);
                        MessageBox.Show("Se ha modificado " + pass + permiso + " del usuario correctamente", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                        this.Close();
                    }
                    catch (NoUserFoundException ex)
                    {
                        MessageBox.Show(ex.mensaje, "Atención", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        Log.Grabar("ERROR: " + ex.Message + "acción realizada por el usuario: " + Agencia.UsuarioLogueado);
                        txtPass.Focus();
                    }
                    catch (EmptyUserPasswordException ex)
                    {
                        MessageBox.Show(ex.mensaje, "Atención", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        Log.Grabar("ERROR: Se intento dar de alta un usuario con la clave vacía." + "acción realizada por el usuario: " + Agencia.UsuarioLogueado);
                        txtPass.Focus();
                    }
                }
            }
        }
       
        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }

    }
}
